﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Produccion.Compras.MatrizHomogeneizacion;

public partial class Modules_Compras_ConsultarOfertasProveedores : System.Web.UI.Page
{

    private const string SESSION_PROVEEDORES_OFERENTES = "SESSION_PROVEEDORES_OFERENTES";
    private const string SESSION_FACTORES_SELECCIONADOS = "SESSION_FACTORES_SELECCIONADOS";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.Page.IsPostBack)
        {
            this.btnAnterior.Enabled = false;
            this.btnSiguiente.Enabled = true;
            this.btnSiguiente.Text = "Siguiente";
            this.wzrABM.ActiveStepIndex = 0;
            this.chkFactorCantidad.Checked = true;

            ClearSession();
        }

        TPPInsumo.ObjType = typeof(Insumo);

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/empleados.gif";
        master.Titulo = "Asistente para Consulta de Ofertas de Proveedores";
    }

    private void ClearSession()
    {
        Session.Remove(SESSION_FACTORES_SELECCIONADOS);
        Session.Remove(SESSION_PROVEEDORES_OFERENTES);
    }

    #region "Navegacion"
    protected void btnSiguiente_Click(object sender, EventArgs e)
    {
        if (ValidarStep())
        {
            _lblError.Text = "";

            wzrABM.ActiveStepIndex = wzrABM.ActiveStepIndex + 1;
            if (wzrABM.ActiveStepIndex == wzrABM.WizardSteps.Count - 2)
                this.btnSiguiente.Text = "Finalizar";
            else if (wzrABM.ActiveStepIndex == wzrABM.WizardSteps.Count - 1)
                this.btnSiguiente.Visible = false;
            else
            {
                this.btnAnterior.Enabled = true;
                this.btnSiguiente.Visible = true;
            }            
        }
    }

    protected void btnAnterior_Click(object sender, EventArgs e)
    {
        wzrABM.ActiveStepIndex = wzrABM.ActiveStepIndex - 1;
        if (wzrABM.ActiveStepIndex == 0)
            this.btnAnterior.Enabled = false;
        else if (wzrABM.ActiveStepIndex == wzrABM.WizardSteps.Count - 2)
        {
            this.btnAnterior.Enabled = true;
            this.btnSiguiente.Enabled = true;
            this.btnSiguiente.Text = "Finalizar";
            this.btnSiguiente.Visible = true;
        }
        else
            this.btnSiguiente.Text = "Siguiente";

        _lblError.Text = "";
    }

    private bool ValidarStep()
    {
        switch (wzrABM.ActiveStepIndex)
        {
            case 0:
                if (TPPInsumo.ItemSelected == null)
                {
                    _lblError.Text = "Debe seleccionar un insumo";
                    return false;
                }
                decimal decCantidad = 0;
                if (txtCantidad.Text.Trim() == string.Empty || !decimal.TryParse(txtCantidad.Text, out decCantidad))
                {
                    _lblError.Text = "La cantidad no es válida";
                    return false;
                }
                break;
            case 1:
                if (!SeleccionarProveedores())
                {
                    //_lblError.Text = "Para poder realizar comparaciones, debe seleccionar al menos dos proveedores";
                    _lblError.Text = "Debe seleccionar al menos un proveedor";
                    return false;
                }
                break;
            case 2:
                if (!SeleccionarFactores())
                {
                    _lblError.Text = "Debe seleccionar al menos un factor para analizar";
                    return false;
                }
                break;
            case 3:
                if (!SeleccionarToleranciaFactores())
                {
                    _lblError.Text = "Verifique los valores ingresados";
                    return false;
                }
                break;
            case 4:
                if (!SeleccionarPuntajesFactores())
                {
                    _lblError.Text = "Verifique los valores ingresados";
                    return false;
                }
                break;
            //default:
            //    _lblError.Text = "Paso del asistente no reconocido";
        }
        return true;
    }
    protected void wzrABM_ActiveStepChanged(object sender, EventArgs e)
    {
        switch (wzrABM.ActiveStepIndex)
        {
            case 0:
                break;
            case 1:
                CargarProveedores();
                break;
            case 2:
                CargarFactores();
                break;
            case 3:
                CargarToleranciaFactores();
                break;
            case 4:
                CargarPuntajesFactores();
                break;
            case 5:
                CalcularMatriz();
                break;
        }
    }
    #endregion

    #region "Step 2 (Proveedores)"
    private void CargarProveedores()
    {
        grdProveedores.AutoGenerateColumns = false;

        string[] strKey = new string[1];
        strKey[0] = "IdProveedor";
        grdProveedores.DataKeyNames = strKey;

        List<ProveedorOferente> objList = Session[SESSION_PROVEEDORES_OFERENTES] as List<ProveedorOferente>;

        if (objList == null)
        {
            Insumo objInsumo = TPPInsumo.ItemSelected as Insumo;

            if (objInsumo != null)
                objList = GestorOferta.GetProveedoresOferentes(objInsumo.IdInsumo);
        }

        grdProveedores.DataSource = objList;
        grdProveedores.DataBind();

        Session[SESSION_PROVEEDORES_OFERENTES] = objList;
    }

    private bool SeleccionarProveedores()
    {
        if (grdProveedores.Rows.Count == 0)
            return false;

        List<ProveedorOferente> objList = Session[SESSION_PROVEEDORES_OFERENTES] as List<ProveedorOferente>;
        if (objList == null)
            return false;

        int contador = 0;
        int IdProveedor = 0;
        CheckBox chkSel;

        //quito la seleccion de todos los proveedores
        for (int j = 0; j < objList.Count; j++)
        {
            objList[j].IsSelected = false;
        }

        for (int i = 0; i < grdProveedores.Rows.Count; i++)
        {
            chkSel = grdProveedores.Rows[i].FindControl("grdChkSel") as CheckBox;
            if (chkSel != null && chkSel.Checked)
            {
                contador++;
                IdProveedor = System.Convert.ToInt32(grdProveedores.DataKeys[i].Value);
                for (int j = 0; j < objList.Count; j++)
                {
                    if (objList[j].IdProveedor == IdProveedor)
                    {
                        objList[j].IsSelected = true;
                    }
                }
            }
        }//for
        Session[SESSION_PROVEEDORES_OFERENTES] = objList;
        CargarProveedores();

        return contador >= 1;
    }
    #endregion

    #region "Step 3 (Factores)"
    private void CargarFactores()
    {
        grdFactores.AutoGenerateColumns = false;

        string[] strKey = new string[1];
        strKey[0] = "IdFactor";
        grdFactores.DataKeyNames = strKey;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;

        if (objList == null)
            objList = GestorOferta.GetFactores();

        grdFactores.DataSource = objList;
        grdFactores.DataBind();

        Session[SESSION_FACTORES_SELECCIONADOS] = objList;
    }

    private bool SeleccionarFactores()
    {
        if (grdFactores.Rows.Count == 0)
            return false;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;
        if (objList == null)
            return false;

        int contador = 0;
        int IdFactor = 0;
        CheckBox chkSel;
        for (int i = 0; i < grdFactores.Rows.Count; i++)
        {
            chkSel = grdFactores.Rows[i].FindControl("grdChkSelFactor") as CheckBox;
            if (chkSel != null && chkSel.Checked)
            {
                contador++;
                IdFactor = System.Convert.ToInt32(grdFactores.DataKeys[i].Value);
                for (int j = 0; j < objList.Count; j++)
                {
                    if (objList[j].IdFactor == IdFactor)
                    {
                        objList[j].IsSelected = true;
                        break;
                    }
                }
            }
        }//for
        Session[SESSION_FACTORES_SELECCIONADOS] = objList;
        CargarFactores();

        return contador > 0;
    }
    #endregion

    #region "Step 4 (Tolerancia Factores)"
    private void CargarToleranciaFactores()
    {
        grdTolerancia.AutoGenerateColumns = false;

        string[] strKey = new string[1];
        strKey[0] = "IdFactor";
        grdTolerancia.DataKeyNames = strKey;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;

        if (objList == null)
            objList = GestorOferta.GetFactores();

        //obtengo solamente los factores seleccionados en el step anterior
        grdTolerancia.DataSource = objList.FindAll(FindSelectedFactorAnalizado);
        grdTolerancia.DataBind();
    }

    /// <summary>
    /// Indica si el factor pasado por parametro ha sido seleccionado
    /// </summary>
    /// <param name="objFactor"></param>
    /// <returns></returns>
    private static bool FindSelectedFactorAnalizado(FactorAnalizado objFactor)
    {
        return objFactor.IsSelected;
    }

    private bool SeleccionarToleranciaFactores()
    {
        if (grdFactores.Rows.Count == 0)
            return false;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;
        if (objList == null)
            return false;

        decimal decTolerancia = 0;
        int IdFactor = 0;
        TextBox txtTolerancia;
        for (int i = 0; i < grdTolerancia.Rows.Count; i++)
        {
            decTolerancia = 0;
            txtTolerancia = grdTolerancia.Rows[i].FindControl("grdTxtTolerancia") as TextBox;
            if (txtTolerancia == null)
                break;
            if (txtTolerancia.Text.Trim() == string.Empty || decimal.TryParse(txtTolerancia.Text, out decTolerancia))
            {
                IdFactor = System.Convert.ToInt32(grdTolerancia.DataKeys[i].Value);
                for (int j = 0; j < objList.Count; j++)
                {
                    if (objList[j].IdFactor == IdFactor)
                    {
                        objList[j].Tolerancia = decTolerancia;                        
                        break;
                    }
                }
            }
            else
            {
                return false;
            }
        }//for
        Session[SESSION_FACTORES_SELECCIONADOS] = objList;
        CargarFactores();

        return true;
    }

    protected void grdTolerancia_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //utilizo este método para que si el objeto no tiene cargado el valor de tolerancia
        //no muestre un cero y muestre un espacio en blanco
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox txtTolerancia = null;
            txtTolerancia = e.Row.FindControl("grdTxtTolerancia") as TextBox;

            if (decimal.Parse(txtTolerancia.Text.Trim()) == 0)
                txtTolerancia.Text = "";
        }
    }

    #endregion

    #region "Step 5 (Puntajes Factores)"
    private void CargarPuntajesFactores()
    {
        grdPuntajes.AutoGenerateColumns = false;

        string[] strKey = new string[1];
        strKey[0] = "IdFactor";
        grdPuntajes.DataKeyNames = strKey;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;

        if (objList == null)
            objList = GestorOferta.GetFactores();

        //obtengo solamente los factores seleccionados en el step anterior
        grdPuntajes.DataSource = objList.FindAll(FindSelectedFactorAnalizado);
        grdPuntajes.DataBind();
    }

    private bool SeleccionarPuntajesFactores()
    {
        if (grdFactores.Rows.Count == 0)
            return false;

        List<FactorAnalizado> objList = Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>;
        if (objList == null)
            return false;

        decimal decPuntaje = 0;
        decimal decTotal = 0;
        int IdFactor = 0;
        TextBox txtPuntaje;
        for (int i = 0; i < grdPuntajes.Rows.Count; i++)
        {
            txtPuntaje = grdPuntajes.Rows[i].FindControl("grdTxtPuntaje") as TextBox;
            if (txtPuntaje == null)
                break;
            if (decimal.TryParse(txtPuntaje.Text, out decPuntaje))
            {
                IdFactor = System.Convert.ToInt32(grdPuntajes.DataKeys[i].Value);
                for (int j = 0; j < objList.Count; j++)
                {
                    if (objList[j].IdFactor == IdFactor)
                    {
                        objList[j].Puntaje = decPuntaje;
                        decTotal += decPuntaje;
                        break;
                    }
                }
            }
            else
            {
                return false;
            }
        }//for
        Session[SESSION_FACTORES_SELECCIONADOS] = objList;
        CargarFactores();

        return decTotal == 100;
    }

    protected void grdPuntajes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //utilizo este método para que si el objeto no tiene cargado el valor del puntaje
        //no muestre un cero y muestre un espacio en blanco
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox txtPuntaje = null;
            txtPuntaje = e.Row.FindControl("grdTxtPuntaje") as TextBox;

            if (decimal.Parse(txtPuntaje.Text.Trim()) == 0)
                txtPuntaje.Text = "";
        }
    }
    #endregion

    #region "Resultado"
    /// <summary>
    /// Indica si el proveedor pasado por parametro ha sido seleccionado
    /// </summary>
    /// <param name="objProveedor"></param>
    /// <returns></returns>
    private static bool FindSelectedProveedorOferente(ProveedorOferente objProveedor)
    {
        return objProveedor.IsSelected;
    }

    private void CalcularMatriz()
    {
        lblOfertasSeleccionadas.Visible = false;
        lblOfertasDescartadas.Visible = false;
        try
        {
            MatrizHomogeneizacion objMatriz = new MatrizHomogeneizacion((Session[SESSION_PROVEEDORES_OFERENTES] as List<ProveedorOferente>).FindAll(FindSelectedProveedorOferente), (Session[SESSION_FACTORES_SELECCIONADOS] as List<FactorAnalizado>).FindAll(FindSelectedFactorAnalizado), TPPInsumo.ItemSelected as Insumo, this.chkFactorCantidad.Checked, decimal.Parse(txtCantidad.Text));
            objMatriz.Calcular();
            grdDescartadas.DataSource = objMatriz.OfertasDescartadas;
            grdDescartadas.DataBind();

            grdResultado.AutoGenerateColumns = false;
            grdResultado.Columns.Clear();

            DataView objDataView = objMatriz.OfertasAprobadas;
            BoundField objCol = null;
            for (int i = 0; i < objDataView.Table.Columns.Count; i++)
            {
                objCol = new BoundField();
                objCol.HeaderText = objDataView.Table.Columns[i].ColumnName;
                objCol.DataField = objDataView.Table.Columns[i].ColumnName;
                grdResultado.Columns.Add(objCol);
            }
            ButtonField objColButton = new ButtonField();
            objColButton.ButtonType = ButtonType.Button;
            objColButton.HeaderText = "";
            objColButton.CommandName = "CREAR_COMPRA";
            objColButton.Text = "Comprar";
            grdResultado.Columns.Add(objColButton);

            string[] strKeys = new string[1];
            strKeys[0] = objDataView.Table.Columns[0].ColumnName;
            grdResultado.DataKeyNames = strKeys;

            grdResultado.DataSource = objDataView;
            grdResultado.DataBind();

            lblOfertasSeleccionadas.Visible = objDataView.Table.Rows.Count == 0;
            lblOfertasDescartadas.Visible = objMatriz.OfertasDescartadas == null || objMatriz.OfertasDescartadas.Count == 0;
        }
        catch (BussinessLogicTecnoPez.BussinessLogicTecnoPezException ex)
        {
            Tecnopez.Globals.Functions.MessageBox(ex.Message, this);
            this._lblError.Text = ex.Message;
        }
        catch (Exception ex)
        {
            this._lblError.Text = ex.Message;
        }
    }

    protected void grdResultado_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "CREAR_COMPRA")
        {
            int idOferta = int.Parse(grdResultado.DataKeys[int.Parse(e.CommandArgument.ToString())].Value.ToString());
            Response.Redirect("ABMPedidosProveedor.aspx?idOferta=" + idOferta);
        }
    }

    #endregion    
}
